home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / dev / cross / GBDK-2.0.lha / GBDK / lib / input.s < prev    next >
Text File  |  1998-10-05  |  9KB  |  578 lines

  1.     .include    "global.s"
  2.  
  3.     .globl    .copy_vram
  4.     .globl    .set_xy_wtt
  5.     .globl    .mv_sprite
  6.     .globl    .set_sprite_prop
  7.     .globl    .set_sprite_tile
  8.     .globl    .jpad
  9.     .globl    .padup
  10.  
  11.     .MINMSPOSX    = 0x02    ; In tiles
  12.     .MINMSPOSY    = 0x0A
  13.     .MAXMSPOSX    = 0x11
  14.     .MAXMSPOSY    = 0x0F
  15.     .INIMSPOSX    = .MINMSPOSX
  16.     .INIMSPOSY    = .MINMSPOSY
  17.  
  18.     .KBDWINPOSY    = 0x08    ; In tiles
  19.     .KBDSIZE    = 0x1006
  20.  
  21.     .MSOFFSETX    = 0x0C    ; In pixels
  22.     .MSOFFSETY    = 0x14
  23.  
  24.     .MINACCEL    = 0x0800
  25.     .MAXACCEL    = 0x0100
  26.  
  27.     .CR    = 0x0A        ; Unix
  28. ;    .CR    = 0x0D        ; Dos
  29.  
  30.     .globl    .tmode_out    ; From 'output.s'
  31.     .globl    .put_char
  32.     .globl    .del_char
  33.     .globl    .cury
  34.  
  35.     .area    _HEADER (ABS)
  36.  
  37.     .org    .MODE_TABLE+4*.T_MODE_INOUT
  38.     JP    .tmode_inout
  39.  
  40.     .module Terminal
  41.  
  42.     .area    _BSS
  43.  
  44. .msx:                ; Mouse position
  45.     .ds    0x01
  46. .msy:
  47.     .ds    0x01
  48. .msacc:                ; Mouse acceleration
  49.     .ds    0x02
  50. .msstate:            ; Mouse state
  51.     .ds    0x01
  52. .mschanged:            ; Did the mouse move?
  53.     .ds    0x01
  54. .string_len:            ; Used length of input buffer
  55.     .ds    0x01
  56.  
  57.     .area    _CODE
  58.  
  59.     ;; Enter text mode with input
  60. .tmode_inout::
  61.     DI            ; Disable interrupts
  62.  
  63.     ;; Turn the screen off
  64.     LDH    A,(.LCDC)
  65.     BIT    7,A
  66.     JR    Z,1$
  67.  
  68.     ;; Turn the screen off
  69.     CALL    .display_off
  70. 1$:
  71.  
  72.     LD    A,(.mode)
  73.     AND    #.T_MODE
  74.     CALL    Z,.tmode_out
  75.  
  76.     LD    BC,#.tp1    ; Move pointer
  77.     LD    HL,#0x8000
  78.     LD    DE,#.endtp1-.tp1
  79.     CALL    .copy_vram
  80.  
  81.     LD    A,#<.MINACCEL    ; Acceleration
  82.     LD    (.msacc),A
  83.     LD    A,#>.MINACCEL
  84.     LD    (.msacc+1),A
  85.  
  86.     ;; Initialize window
  87.     LD    BC,#.frame_tiles
  88.     LD    DE,#0x0000    ; Place image at (0x00,0x00) tiles
  89.     LD    HL,#0x140A    ; Image size is 0x14 x 0x0A tiles
  90.     CALL    .set_xy_wtt
  91.     LD    BC,#.kbdtable
  92.     LD    DE,#0x0202    ; Place image at (0x02,0x02) tiles
  93.     LD    HL,#.KBDSIZE    ; Image size is 0x10 x 0x06 tiles
  94.     CALL    .set_xy_wtt
  95.     XOR    A
  96.     LD    A,#.MINWNDPOSX
  97.     LDH    (.WX),A
  98.     LD    A,#.MAXWNDPOSY    ; Hide window
  99.     LDH    (.WY),A
  100.  
  101.     ;; Initialize sprite
  102.     LD    C,#0x00        ; Sprite 0x00
  103.     LD    D,#0x00        ; Default sprite properties
  104.     CALL    .set_sprite_prop
  105.     LD    C,#0x00        ; Sprite 0x00
  106.     LD    D,#0x00        ; Tile 0x00
  107.     CALL    .set_sprite_tile
  108.     LD    A,#0b00101100
  109.     LDH    (.OBP0),A
  110.  
  111.     ;; Turn the screen on
  112.     LD    A,#0b11000001    ; LCD        = On
  113.                 ; WindowBank    = 0x9C00
  114.                 ; Window    = Off
  115.                 ; BG Chr    = 0x8800
  116.                 ; BG Bank    = 0x9800
  117.                 ; OBJ        = 8x8
  118.                 ; OBJ        = Off
  119.                 ; BG        = On
  120.     LDH    (.LCDC),A
  121.  
  122.     LD    A,#.T_MODE_INOUT
  123.     LD    (.mode),A
  124.  
  125.     EI            ; Enable interrupts
  126.  
  127.     RET
  128.  
  129.     ;; Prompt the user for a char and return it in A
  130. .get_char:
  131.     PUSH    BC
  132.     PUSH    DE
  133.     PUSH    HL
  134.     CALL    .show_kbd
  135.     CALL    .show_mouse
  136. 1$:
  137.     CALL    .track_mouse
  138.     CALL    .update_mouse
  139.     CALL    .jpad
  140.     LD    D,A
  141.     AND    #.A        ; Is A pressed ?
  142.     JP    Z,1$
  143.  
  144.     LD    A,(.msy)    ; Look for char under the mouse
  145.     SUB    #.MINMSPOSY
  146.     JR    Z,12$
  147.     LD    E,A
  148.     XOR    A
  149. 11$:
  150.     ADD    #.MAXMSPOSX-.MINMSPOSX+1
  151.     DEC    E
  152.     JR    NZ,11$
  153. 12$:
  154.     LD    E,A
  155.     LD    A,(.msx)
  156.     SUB    #.MINMSPOSX
  157.     ADD    E
  158.     LD    HL,#.kbdtable
  159.     LD    B,#0x00
  160.     LD    C,A
  161.     ADD    HL,BC
  162.     LD    B,(HL)
  163.  
  164.     CALL    .hide_mouse
  165.     CALL    .hide_kbd
  166.     LD    A,B
  167.  
  168.     POP    HL
  169.     POP    DE
  170.     POP    BC
  171.     RET
  172.  
  173.     ;; Prompt the user for a string and store it in (HL)
  174. .get_string:
  175.     PUSH    BC
  176.     PUSH    DE
  177.     PUSH    HL
  178.     CALL    .show_kbd
  179.     CALL    .show_bkg
  180.     CALL    .show_mouse
  181.     XOR    A
  182.     LD    (.string_len),A
  183. 1$:
  184.     CALL    .track_mouse
  185.     CALL    .update_mouse
  186.     CALL    .jpad
  187.     LD    D,A
  188.     AND    #.A        ; Is A pressed ?
  189.     JP    NZ,10$
  190.     LD    A,D
  191.     AND    #.B        ; Is B pressed ?
  192.     JP    NZ,20$
  193.     LD    A,D
  194.     AND    #.SELECT    ; Is SELECT pressed ?
  195.     JP    NZ,30$
  196.     LD    A,D
  197.     AND    #.START        ; Is START pressed ?
  198.     JR    Z,1$
  199.     CALL    .padup        ; Wait for button to be depressed
  200.  
  201.     LD    A,#.CR
  202.     CALL    .put_char
  203.     LD    (HL),#0x00
  204.     CALL    .hide_mouse
  205.     CALL    .hide_bkg
  206.     CALL    .hide_kbd
  207.     POP    HL
  208.     POP    DE
  209.     POP    BC
  210.     RET
  211.  
  212. 10$:
  213.     ;; Insert a character at cursor position
  214.     LD    A,(.string_len) ; Check buffer length
  215. ;    CP    #.BUFLEN-1    ; Keep 1 char for EOS
  216. ;    JR    Z,13$
  217.     INC    A
  218.     LD    (.string_len),A ; Update it
  219.     LD    A,(.msy)    ; Look for char under the mouse
  220.     SUB    #.MINMSPOSY
  221.     JR    Z,12$
  222.     LD    E,A
  223.     XOR    A
  224. 11$:
  225.     ADD    #.MAXMSPOSX-.MINMSPOSX+1
  226.     DEC    E
  227.     JR    NZ,11$
  228. 12$:
  229.     LD    E,A
  230.     LD    A,(.msx)
  231.     SUB    #.MINMSPOSX
  232.     ADD    E
  233.     PUSH    HL
  234.     LD    HL,#.kbdtable
  235.     LD    B,#0x00
  236.     LD    C,A
  237.     ADD    HL,BC
  238.     LD    A,(HL)
  239.     POP    HL
  240.     LD    (HL+),A        ; Add it into input buffer
  241.     CALL    .put_char    ; Print it
  242.     CALL    .show_bkg    ; Ensure the text is not hidden
  243. 13$:
  244.     CALL    .padup        ; Wait for button to be depressed
  245.     JP    1$
  246.  
  247. 20$:
  248.     ;; Delete a character at cursor position
  249.     LD    A,(.string_len) ; Is there any char in the buffer ?
  250.     OR    A
  251.     JR    Z,21$
  252.     DEC    A        ; Yes
  253.     LD    (.string_len),A ; Update buffer length
  254.     DEC    HL
  255.     CALL    .del_char
  256. 21$:
  257.     CALL    .padup        ; Wait for button to be depressed
  258.     JP    1$
  259.  
  260. 30$:
  261.     CALL    .hide_mouse
  262.     CALL    .hide_bkg
  263.     CALL    .hide_kbd
  264.     CALL    .padup        ; Wait for button to be depressed
  265.     CALL    .show_kbd
  266.     CALL    .show_bkg
  267.     CALL    .show_mouse
  268.     JP    1$
  269.  
  270. .show_kbd:
  271.     PUSH    BC
  272.     PUSH    DE
  273.     LDH    A,(.LCDC)
  274.     OR    #0b00100000    ; Window = On
  275.     LDH    (.LCDC),A
  276.     LD    A,#.MAXWNDPOSY    ; Show window
  277. 1$:
  278.     BIT    0,A        ; Wait for VBL every 2 pixels (slow down)
  279.     JR    NZ,2$
  280.     LD    B,A
  281.     CALL    .wait_vbl_done
  282.     LD    A,B
  283. 2$:
  284.     LDH    (.WY),A
  285.     CP    #.KBDWINPOSY*0x08
  286.     JR    Z,99$
  287.     DEC    A
  288.     JR    1$
  289. 99$:
  290.     POP    DE
  291.     POP    BC
  292.     RET
  293.  
  294. .hide_kbd:
  295.     PUSH    BC
  296.     PUSH    DE
  297.     LD    A,#.KBDWINPOSY*0x08+1
  298. 1$:                ; Hide window
  299.     BIT    0,A        ; Wait for VBL every 2 pixels (slow down)
  300.     JR    Z,2$
  301.     LD    B,A
  302.     CALL    .wait_vbl_done
  303.     LD    A,B
  304. 2$:
  305.     LDH    (.WY),A
  306.     CP    #.MAXWNDPOSY
  307.     JR    Z,3$
  308.     INC    A
  309.     JR    1$
  310. 3$:
  311.     LDH    A,(.LCDC)
  312.     AND    #0b11011111    ; Window = Off
  313.     LDH    (.LCDC),A
  314.     POP    DE
  315.     POP    BC
  316.     RET
  317.  
  318. .show_bkg:
  319.     PUSH    BC
  320.     PUSH    DE
  321.     LDH    A,(.SCY)
  322.     LD    D,A
  323.     LD    A,(.cury)
  324.     SUB    #.KBDWINPOSY-1
  325.     JR    C,99$
  326.     JR    Z,99$
  327.     SLA    A        ; A = A * 8
  328.     SLA    A
  329.     SLA    A
  330.     SUB    D
  331.     JR    C,99$
  332.     JR    Z,99$
  333.     LD    C,A
  334.     LDH    A,(.SCY)
  335. 1$:
  336.     BIT    0,A        ; Wait for VBL every 2 pixels (slow down)
  337.     JR    Z,2$
  338.     LD    B,A
  339.     CALL    .wait_vbl_done
  340.     LD    A,B
  341. 2$:
  342.     INC    A
  343.     LDH    (.SCY),A
  344.     DEC    C
  345.     JR    Z,99$
  346.     JR    1$
  347. 99$:
  348.     POP    DE
  349.     POP    BC
  350.     RET
  351.  
  352. .hide_bkg:
  353.     LDH    A,(.SCY)
  354.     OR    A
  355.     RET    Z
  356.     PUSH    BC
  357.     PUSH    DE
  358. 1$:
  359.     BIT    0,A        ; Wait for VBL every 2 pixels (slow down)
  360.     JR    Z,2$
  361.     LD    B,A
  362.     CALL    .wait_vbl_done
  363.     LD    A,B
  364. 2$:
  365.     DEC    A
  366.     LDH    (.SCY),A
  367.     JR    Z,99$
  368.     JR    1$
  369. 99$:
  370.     POP    DE
  371.     POP    BC
  372.     RET
  373.  
  374. .show_mouse:
  375.     LD    A,#.INIMSPOSX
  376.     LD    (.msx),A
  377.     LD    A,#.INIMSPOSY
  378.     LD    (.msy),A
  379.     CALL    .set_mouse
  380.     LDH    A,(.LCDC)
  381.     OR    #0b00000010    ; OBJ = On
  382.     LDH    (.LCDC),A
  383.     RET
  384.  
  385. .hide_mouse:
  386.     LDH    A,(.LCDC)
  387.     AND    #0b11111101    ; OBJ = Off
  388.     LDH    (.LCDC),A
  389.     RET
  390.  
  391. .track_mouse:
  392.     PUSH    BC
  393.     PUSH    DE
  394.     PUSH    HL
  395.     XOR    A
  396.     LD    (.mschanged),A    ; Default to no change
  397.     CALL    .jpad
  398.     LD    D,A
  399.  
  400.     LD    HL,#.msstate
  401.     AND    #.UP+.DOWN+.LEFT+.RIGHT
  402.     JR    NZ,1$
  403.     LD    (HL),#0x00    ; Reset state
  404.     JP    99$
  405. 1$:
  406.     LD    A,(HL)
  407.     LD    (HL),#0x01    ; Set state
  408.     OR    A        ; Was it 0 ?
  409.     LD    HL,#.msacc    ; Acceleration
  410.     JR    NZ,2$
  411.                 ; Yes
  412.     LD    (HL),#<.MINACCEL
  413.     INC    HL
  414.     LD    (HL),#>.MINACCEL
  415.     JR    4$        ; Update position
  416. 2$:
  417.     LD    C,(HL)
  418.     INC    HL
  419.     LD    B,(HL)
  420.     DEC    BC
  421.     LD    A,B
  422.     OR    C
  423.     JR    Z,3$
  424.     LD    (HL),B
  425.     DEC    HL
  426.     LD    (HL),C
  427.     JP    99$
  428. 3$:                ; Set new acceleration to maximum
  429.     LD    (HL),#>.MAXACCEL
  430.     DEC    HL
  431.     LD    (HL),#<.MAXACCEL
  432. 4$:                ; Update position
  433.     LD    A,#0x01
  434.     LD    (.mschanged),A
  435.     LD    A,D
  436.     AND    #.UP        ; Is UP pressed ?
  437.     JR    Z,6$
  438.     LD    A,(.msy)
  439.     CP    #.MINMSPOSY
  440.     JR    Z,5$
  441.     DEC    A
  442.     LD    (.msy),A
  443.     JR    6$
  444. 5$:
  445.     LD    A,#.MAXMSPOSY
  446.     LD    (.msy),A
  447. 6$:
  448.     LD    A,D
  449.     AND    #.DOWN        ; Is DOWN pressed ?
  450.     JR    Z,8$
  451.     LD    A,(.msy)
  452.     CP    #.MAXMSPOSY
  453.     JR    Z,7$
  454.     INC    A
  455.     LD    (.msy),A
  456.     JR    8$
  457. 7$:
  458.     LD    A,#.MINMSPOSY
  459.     LD    (.msy),A
  460. 8$:
  461.     LD    A,D
  462.     AND    #.LEFT        ; Is LEFT pressed ?
  463.     JR    Z,10$
  464.     LD    A,(.msx)
  465.     CP    #.MINMSPOSX
  466.     JR    Z,9$
  467.     DEC    A
  468.     LD    (.msx),A
  469.     JR    10$
  470. 9$:
  471.     LD    A,#.MAXMSPOSX
  472.     LD    (.msx),A
  473. 10$:
  474.     LD    A,D
  475.     AND    #.RIGHT        ; Is RIGHT pressed ?
  476.     JR    Z,99$
  477.     LD    A,(.msx)
  478.     CP    #.MAXMSPOSX
  479.     JR    Z,11$
  480.     INC    A
  481.     LD    (.msx),A
  482.     JR    99$
  483. 11$:
  484.     LD    A,#.MINMSPOSX
  485.     LD    (.msx),A
  486. 99$:
  487.     POP    HL
  488.     POP    DE
  489.     POP    BC
  490.     RET
  491.  
  492. .update_mouse:
  493.     LD    A,(.mschanged)    ; Did it change ?
  494.     OR    A
  495.     RET    Z        ; No
  496. .set_mouse:
  497.     PUSH    BC
  498.     PUSH    DE
  499.     PUSH    HL
  500.     LD    C,#0x00        ; Sprite 0x00
  501.     LD    A,(.msx)
  502.     SLA    A        ; A = A * 8
  503.     SLA    A
  504.     SLA    A
  505.     ADD    #.MSOFFSETX
  506.     LD    D,A
  507.     LD    A,(.msy)
  508.     SLA    A        ; A = A * 8
  509.     SLA    A
  510.     SLA    A
  511.     ADD    #.MSOFFSETY
  512.     LD    E,A
  513.     CALL    .mv_sprite
  514.     POP    HL
  515.     POP    DE
  516.     POP    BC
  517.     RET
  518.  
  519. _getchar::
  520.     LD    A,(.mode)
  521.     CP    #.T_MODE_INOUT
  522.     JR    Z,1$
  523.     PUSH    BC
  524.     CALL    .tmode_inout
  525.     POP    BC
  526. 1$:
  527.     CALL    .get_char
  528.     LD    E,A
  529.     RET
  530.  
  531. _gets::
  532.     LD    A,(.mode)
  533.     CP    #.T_MODE_INOUT
  534.     JR    Z,1$
  535.     PUSH    BC
  536.     CALL    .tmode_inout
  537.     POP    BC
  538. 1$:
  539.     LDA    HL,2(SP)    ; Skip return address
  540.     LD    A,(HL+)
  541.     LD    H,(HL)        ; HL = s
  542.     LD    L,A
  543.     PUSH    HL
  544.     CALL    .get_string
  545.     POP    DE
  546.     RET
  547.  
  548.     .area    _DATA
  549.  
  550. .tp1:
  551.  
  552. .pointers:
  553.  
  554.     ; Tile 0x00
  555.     .byte    0xFF,0xFF,0xFE,0x82,0xFC,0x84,0xFC,0x84,0xFE,0x82,0xFF,0xB1,0xCF,0xC9,0x87,0x87
  556.  
  557. .endtp1:
  558.  
  559. .frame_tiles:
  560.     .byte    0x1C,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x1D
  561.     .byte    0x0F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0F
  562.     .byte    0x0F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0F
  563.     .byte    0x0F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0F
  564.     .byte    0x0F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0F
  565.     .byte    0x0F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0F
  566.     .byte    0x0F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0F
  567.     .byte    0x0F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0F
  568.     .byte    0x0F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0F
  569.     .byte    0x1E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x1F
  570.  
  571. .kbdtable:
  572.     .ascii    | !"#$%&'()*+,-./|
  573.     .ascii    "0123456789:;<=>?"
  574.     .ascii    "@ABCDEFGHIJKLMNO"
  575.     .ascii    "PQRSTUVWXYZ[\\]^_"
  576.     .ascii    "`abcdefghijklmno"
  577.     .ascii    "pqrstuvwxyz{|}~ "
  578.